package com.sc.nft.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sc.nft.dto.DaoEquityPropsCountDTO;
import com.sc.nft.entity.UserEquityProps;
import com.sc.nft.entity.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.Date;
import java.util.List;

/**
 * 用户权益道具表(sc_user_equity_props)数据Mapper
 *
 * @author Sun
 * @description 由 Mybatisplus Code Generator 创建
 * @since 2023-03-28 10:28:43
 */
@Mapper
public interface UserEquityPropsMapper extends BaseMapper<UserEquityProps> {


    /**
     * 分页查询用户权益道具
     *
     * @param page
     * @param userId
     * @param isExpired
     * @return
     */
    Page<PageUserEquityPropsVO> getPageUserEquityProps(Page page, @Param("userId") Long userId, @Param("isExpired") Integer isExpired);

    Page<UserEquityPropsVO> getMyEquity(Page page, @Param("userId") Long userId, @Param("topId") Long topId);

    UserEquityPropsVO getMyEquityCount(@Param("activityId") Long activityId, @Param("userId") Long userId, @Param("eqId") Long eqId);

    Page<UserEquityPropsDetailVO> getMyEquityDetail(@Param("page") Page page, @Param("userId") Long userId, @Param("id") Long id, @Param("isExpired") Integer isExpired, @Param("isGift") Boolean isGift, @Param("dateTime") Date dateTime);

    /**
     * 分页获取用户持有道具
     *
     * @param page
     * @param userId
     * @param firstTitle
     * @return
     */
    Page<UserEquityPropsSimpleVO> pageUserWithEquityProps(Page page, @Param("userId") Long userId, @Param("firstTitle") String firstTitle);

    /**
     * 根据道具id获取持有此道具的人数（持有，且未过期）
     *
     * @param equityId
     * @return
     */
    Integer getHasUserCountByEquityId(@Param("equityId") Long equityId);

    /**
     * 分页获取道具卡失效记录
     *
     * @param page
     * @param userId
     * @param firstTitle
     * @param startTime
     * @param endTime
     * @return
     */

    Page<EquityPropsExpiredLogPageVO> expiredLog(Page page, @Param("userId") Long userId, @Param("firstTitle") String firstTitle, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取用户持有的为过期的道具卡
     *
     * @param page
     * @param userTel
     * @param firstTitle
     * @param getBeginTime
     * @param getEndTime
     * @param expiredBeginTime
     * @param expiredEndTime
     * @return
     */
    Page<AdminUserEquityPropsPagVO> getAdminUserEquityPropsPage(Page page, @Param("userTel") String userTel, @Param("firstTitle") String firstTitle, @Param("getBeginTime") Date getBeginTime, @Param("getEndTime") Date getEndTime, @Param("expiredBeginTime") Date expiredBeginTime, @Param("expiredEndTime") Date expiredEndTime, @Param("onConsignStatus") Integer onConsignStatus);

    /**
     * 用户可寄售权益道具列表
     *
     * @param page
     * @param equityPropsId
     * @return
     */
    Page<UserConsignEquityPropsPageVO> getUserConsignEquityPropsPage(Page page, @Param("equityPropsId") Long equityPropsId, @Param("userId") Long userId);

    /**
     * 获取用户可寄售权益道具列表
     *
     * @param userId
     * @param equityPropsId
     * @param ids
     * @return
     */
    Integer getSellableCountByUserIdAndEquityPropsIdAndIds(@Param("userId") Long userId, @Param("equityPropsId") Long equityPropsId, @Param("ids") List<Long> ids);

    /**
     * 获取用户拥有的道具
     *
     * @param userId
     * @param firstTitle
     * @return
     */
    List<HoldPropDataVO> holdProp(@Param("userId") Long userId, @Param("firstTitle") String firstTitle);

    /**
     * 获取用户拥有的道具
     */
    List<HoldPropDataVO> getSingleHoldEquityPropDataByUserIdAndEquityPropId(@Param("userId") Long userId, @Param("id") Long id);

    /**
     * 获取用户拥有的道具分页集合
     *
     * @param page
     * @param userId
     * @param id
     * @return
     */
    Page<HoldPropDataVO> getSingleHoldEquityPropData(Page page, @Param("userId") Long userId, @Param("id") Long id);


    @Select("select count(1)" +
            "        from sc_second_equity_props_config ssepc\n" +
            "        LEFT JOIN sc_user_equity_props sep ON ssepc.equity_props_id = sep.equity_props_id\n" +
            "        WHERE\n" +
            "        sep.user_id = #{userId}\n" +
            "        and ssepc.is_delete = 0\n" +
            "        and\tsep.is_delete = 0\n" +
            "        AND sep.expired_time > now()\n" +
            "        AND ssepc.status = 1\n" +
            "        AND sep.holding_status = 1")
    Integer getHavingEquityPropsCountByUserId(@Param("userId") Long userId);


    @Update("update sc_user_equity_props set activity_id=#{activityId},is_consume=1 where id=#{id}")
    Integer updateUserEquityById(@Param("activityId") Long activityId, @Param("id") Long id);

    /**
     * 根据补签道具Id 获取用户补签道具有多少
     * @param userId
     * @param equityPropsId
     * @return
     */
    Integer getMyEquityPropsByEquityPropsId(@Param("userId") Long userId, @Param("equityPropsId") Long equityPropsId);

    List<UserEquityProps> getListByIdsAndDelete(@Param("userEquityPropsIds") List<Long> userEquityPropsIds);

    /**
     * 商城用户持有的权益道具
     * @param vistIn
     * @param userId
     * @return
     */
    List<MallEquityPropsVO> getUserEquityProps(@Param("vistIn") Long vistIn, @Param("userId") Long userId);


    Page<MallEquityUserHoldVo> pageEquityHold(Page<UserEquityProps> page, @Param("equityPropsIds") List<Long> equityPropsId, @Param("userId") Long userId);

    Page<MallUserEquityPropsVO> pageUserEquityProps(@Param("userId") Long userId, @Param("vistIn") Long vistIn,
        @Param("status") Integer status, Page<UserEquityProps> page);
    
    List<UserHoldPropsCountVO> getUserPropsHoldCount(@Param("userId") Long userId, @Param("equityPropsIds") List<Long> equityPropsIds);
    List<DaoEquityPropsCountDTO> countWithDao(@Param("daoId") Long daoId);

    Page<DaoEquityPropsVO> daoEquityHoldDetail(Page page,@Param("daoId") Long daoId,@Param("equityPropsId") Long equityPropsId,@Param("phoneNo") String phoneNo,@Param("startTime") Date startTime,@Param("endTime") Date endTime );

    Long getUnderHoldCount(@Param("userId")Long userId,@Param("equityPropsIds") List<Long> equityPropsIds);
}
